package com.xiaolun.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class JDKProxy {
    public static void main(String[] args) {
        //创建接口代理对象
        Class[] interfaces = {UserDao.class};
        UserDaoImpl userDao = new UserDaoImpl();
        UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        int result = dao.add(1, 2);
        System.out.println("result="+result);
    }
}

//创建代理对象代码
class UserDaoProxy implements InvocationHandler{
    //1 把创建的是谁的代理对象使用有参构造的方式传递过来。
    private Object obj;

    public UserDaoProxy(Object obj) {
        this.obj = obj;
    }

    //增强逻辑的代码
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前
        System.out.println("方法执行之前。。。。。");
        //我们可以通过method.getName()来得到需要增强不同的方法，进而可以进行其他的操作。
        System.out.println("method.getName()----->"+method.getName());
        System.out.println("传递的参数:"+ Arrays.toString(args));

        /** 执行被增强的方法(通过invoke传对象和参数)
         * obj对象中带有参数args的 method方法。res，也既是该方法的返回值。
         */
        Object res = method.invoke(obj, args);

        //方法之后
        System.out.println("方法执行之后。。。。。。"+obj);
        return res;
    }
}